const fs = require('fs');
const path = require('path');
const { NodeSSH } = require('node-ssh');
const archiver = require('archiver');
const ssh = new NodeSSH();

// === 配置区 ===
const config = {
    host: '120.26.32.100',
    port: 22, // 添加SSH端口，默认为22
    username: 'root',
    password: 'Guang9269',
    // 也可尝试使用密钥认证
    // privateKey: fs.readFileSync('/path/to/private/key', 'utf8'),
    // passphrase: '如果你的密钥有密码，填写在这里',
    zipName: 'server.zip',
    remoteDir: '/www/wwwroot/pinyin-server',
    // 增加重试和超时配置
    tryKeyboard: true, // 允许键盘交互式认证
    readyTimeout: 30000, // 延长连接超时时间
};

// 1. 压缩 server.js
function zipServer() {
    return new Promise((resolve, reject) => {
        console.log('正在压缩 server.js...');
        const output = fs.createWriteStream(path.join(__dirname, `../${config.zipName}`));
        const archive = archiver('zip', { zlib: { level: 9 } });

        output.on('close', () => {
            console.log(`server.zip 创建成功，大小: ${archive.pointer()} 字节`);
            resolve();
        });
        archive.on('error', (err) => reject(err));
        archive.pipe(output);
        archive.file(path.join(__dirname, '../server.js'), { name: 'server.js' });
        archive.finalize();
    });
}

async function deploy() {
    try {
        // 1. 压缩 server.js
        await zipServer();

        // 2. 连接服务器
        console.log('连接服务器...');
        await ssh.connect(config);

        // 3. 上传 server.zip
        console.log('上传 server.zip...');
        await ssh.putFile(
            path.join(__dirname, `../${config.zipName}`),
            `${config.remoteDir}/${config.zipName}`
        );
        console.log('上传完成');

        // 4. 停止 pm2 服务
        console.log('停止 pm2 pinyin-server...');
        await ssh.execCommand('pm2 stop pinyin-server', { cwd: config.remoteDir });

        // 5. 解压 server.zip 覆盖 server.js
        console.log('解压 server.zip...');
        const unzipResult = await ssh.execCommand(
            `unzip -o ${config.zipName} -d ${config.remoteDir}`,
            { cwd: config.remoteDir }
        );
        if (unzipResult.stderr) {
            console.error('解压过程中出现错误:', unzipResult.stderr);
        } else {
            console.log('解压完成');
        }

        // 6. 启动 pm2 服务
        console.log('启动 pm2 pinyin-server...');
        await ssh.execCommand('pm2 start server.js --name pinyin-server', { cwd: config.remoteDir });

        // 7. 清理本地 zip
        // fs.unlinkSync(path.join(__dirname, `../${config.zipName}`));

        console.log('✅ 部署完成！');
        ssh.dispose();
    } catch (err) {
        console.error('❌ 部署失败:', err);
        ssh.dispose();
        process.exit(1);
    }
}

deploy(); 